package designPattern.command.macroCommand
{
	public class MacroCommandMainClass
	{
		/**
		 *概述：
		 * 命令模式将行为内置在命令中。通过调用命令对象中的execute()方法执行命令。执行命令是委派的是什么
		 * 类，实现行为时使用的是哪个方法对客户端来说都是透明的。降低了任务发起者和任务实现者代码耦合。
		 * 单个命令对象可以有多个命令发起者共享。例如，命令对象的某个实例可以被应用程序中的多个不同代码
		 * 共享使用。这使得扩展或修改命令中的行为变得简单。
		 * 可以在运行时动态的将命令对象赋值给任务发起者，这样可以根据应用程序的变化得到不同的执行结果。
		 * 这在根据环境不断变化的应用程序时非常有用。
		 *命令模式的主要特征：
		 * #命令模式在一个简单的命令对象中封装行为
		 * #减少了调用行为的类及执行行为的类之间的耦合
		 * #允许客户端运行中动态通过创建新命令对象从而执行新的行为，并将按那个新的行为指派给发起者invoker
		 * #可以实现应用程序的命令链(宏命令)、恢复、重做和日志特征 
		 *
		 * 妈妈给爸爸(Invoker)留了一些信件(Command)，每个信件上写着具体的家务和具体的孩子(Receiver)，也就是说孩子
		 * 和具体的家务是成对出现的。
		 * 
		 *一个Command包装一个Receiver
		 *本例为实现宏命令
		 */		
		public function MacroCommandMainClass()
		{
			//创建宏命令
			var macroCom:MacroCommand = new MacroCommand();
			
			//创建两个接收者
			var rec_a:Receiver_A = new Receiver_A();
			var rec_b:Receiver_B = new Receiver_B();
			
			//创建两个具体的命令
			var com_a:ICommand = new Command_A(rec_a);
			var com_b:ICommand = new Command_B(rec_b);
			
			macroCom.add(com_a);
			macroCom.add(com_b);
			
			//创建一个执行者
			var invoker:IInvoker = new Invoker();
			invoker.setComand(macroCom);
			(invoker as Invoker).startTimer();
			
			//创建多个invoker可以共享命令
		}
	}
}